// 封装axios库
import axios from "axios";

// const BASE_URL = "http://codercba.com:8000";
// 使用代理路径而不是直接的外部URL
const BASE_URL =
  process.env.NODE_ENV === "development"
    ? "/api"
    : "https://pcapi-xiaotuxian-front-devtest.itheima.net";
const TIMEOUT = 10000;

class HYReqest {
  constructor(baseURL, timeout = 10000) {
    this.instance = axios.create({
      baseURL,
      timeout,
    });

    //在拦截器中加载动画
    // 1.请求拦截
    this.instance.interceptors.request.use(
      (config) => {
        // 请求成功则显示加载动画
        // mainStore.isLoading = true;
        const token = localStorage.getItem("token");
        if (config.headers && token) {
          //类型缩小
          config.headers.Authorization = "Bearer " + token;
          console.log("请求拦截");
        }
        return config;
      },
      (err) => {
        console.error("请求拦截器错误:", err);
        return Promise.reject(err);
      }
    );

    // 2.响应拦截
    // 不管响应成功还是响应失败都应该取消动画
    this.instance.interceptors.response.use(
      (config) => {
        // mainStore.isLoading = false;
        return config;
      },
      (err) => {
        // mainStore.isLoading = false;
        console.error("响应拦截器错误:", err);
        // 提供更友好的错误信息
        if (err.code === "NETWORK_ERROR") {
          console.error("网络连接错误，请检查网络连接或联系管理员");
        }
        return Promise.reject(err);
      }
    );
  }

  request(config) {
    //但是动画最好放在拦截器中处理
    // 在网络请求之前加载动画
    // mainStore.isLoading =true
    return new Promise((resolve, reject) => {
      this.instance
        .request(config)
        .then((res) => {
          // console.log(res);
          resolve(res.data);
        })
        .catch((err) => {
          console.error("网络请求失败:", err);
          reject(err);
          // 网络请求失败就取消动画
          // mainStore.isLoading =false
        });
    });
  }
  get(config) {
    return this.request({ ...config, method: "get" });
  }

  post(config) {
    return this.request({ ...config, method: "post" });
  }
}

// y也可以在引入时创建实例
// const hyRequest1 = new HYReqest("http://123.207.32.32:8000")

// 在导出时,直接导出一个实例,这样在用的时候就不用创建实例了
export default new HYReqest(BASE_URL, TIMEOUT);
